package pool.preprocess;

import java.util.Hashtable;
import java.util.Vector;
import pool.tablename.Pool;
import utility.ConvertToLower;
import database.RecordSearch;
import dbmanager.ChekInMaster;
import dbmanager.Column;
import dbmanager.DBManager;
import dbmanager.GetIdName;

public class Mapper implements Process 
{
	DBManager database;
	String TYPE="type";
	GetIdName gid;
	String OLDVALUE="oldvalue";
	String NEWVALUE="newvalue";
	
	Hashtable<Object, Object> MasterMap = new Hashtable<Object, Object>();
	Vector<Object> propertyvector = new Vector<Object>();
	
	public void beforeAdd(String value) 
	{
		
	}

	public void beforeDel(String value) 
	{
	
	}

	public void beforeMod(String value) 
	{
		
	}

	public void beforeView(String value) 
	{
		
	}

	public Hashtable<Object, Object> gethashtable() 
	{
		return null;
	}

	public void process(String value) 
	{
		RecordSearch rs =new RecordSearch(database);
		Hashtable<Object, Object> Condition = new Hashtable<Object, Object>();
		Condition.put("mid", value);
		Condition.put("td", "null");
		rs.setConditionMap(Condition);
		String line[]= rs.getArrayFromResultSet();
		if(line.length>0)
		{
		  for(int i=0;i<line.length;i++)
		  {
			  String splitline[] = line[i].split("\t");
			  if(!splitline[Column.pid_index-1].equals(TYPE))
			  {
				  String property= gid.getItem(splitline[Column.pid_index-1]);
				  Condition.clear();
				  Condition.put("mid", splitline[Column.pv_index-1]);
				  Condition.put("td", "null");
				  rs.setConditionMap(Condition);
				  String result[] = rs.getArrayFromResultSet();
				  Hashtable<Object, Object> oldvaluehash = new Hashtable<Object, Object>();
				  for(int k=0;k<result.length;k++)
				  {
					  String spliresult[] = result[k].split("\t");
					  String pv = spliresult[Column.pv_index-1];
					  if(pv.equals("0"))
						  pv = spliresult[Column.vt_index-1];
					  else
						  pv = gid.getItem(pv);
					  oldvaluehash.put(gid.getItem(spliresult[Column.pid_index-1]), pv);
				  }
				  oldvaluehash = ConvertToLower.convertHashKey(oldvaluehash);
				  if(MasterMap.containsKey(property))
				  {
					  String tempv = MasterMap.get(property).toString();
					  if(oldvaluehash.containsKey(OLDVALUE))
					  {
						  String oldvalue = oldvaluehash.get(OLDVALUE).toString();
						  if(MasterMap.get(property).equals(oldvalue))
						  {
							  String newvalue =oldvaluehash.get(NEWVALUE).toString();
							  MasterMap.put(property, newvalue);
						  }
					  }
				  }
				  else
				  {
					  for(int j=0;j<propertyvector.size();j++)
					  {  
						  Hashtable<Object, Object> propertymap = (Hashtable<Object, Object>) propertyvector.get(j);
						  String pid=propertymap.get("pid").toString();
						  
						  if(pid.equals(splitline[Column.pid_index-1]))
						  {
							  String temppv="";
							  if(propertymap.containsKey("pv"))
							  {
								  temppv = propertymap.get("pv").toString();
								  temppv = gid.getItem(temppv);
							  }  
							  else
							  {
								  temppv = propertymap.get("vt").toString();
							  }  
							  if(oldvaluehash.containsKey(OLDVALUE))
							  {
								  String oldvalue = oldvaluehash.get(OLDVALUE).toString();
								  if(temppv.equals(oldvalue))
								  {
									  String newvalue =oldvaluehash.get(NEWVALUE).toString();
									  ChekInMaster checkinmaster =new ChekInMaster(database);
									  if(checkinmaster.isInMaster(newvalue))										  
										  propertymap.put("pv", gid.getId(newvalue));
									  else
										  propertymap.put("vt", newvalue);
								  }
							  }
						  }
					  }
				  }	  
				  
			  }
			}
	  	
		}
		
	}


	public void setType(String type, String table) 
	{
		
	}

	
	public Hashtable<Object, Object> getMasterMap() 
	{
		return MasterMap;
	}

	
	public Vector<Object> getPropertyVector() 
	{
		return propertyvector;
	}

	
	public void setBasicMap(Hashtable<Object, Object> Mastermap) 
	{	
	}

	
	public void setDBManager(DBManager database) 
	{
		this.database = database;
		gid= new GetIdName(database);
		TYPE = gid.getId(TYPE);
	}

	
	public void setMasterMap(Hashtable<Object, Object> Mastermap) 
	{
		this.MasterMap.putAll(Mastermap);
	}

	
	public void setPropertyvector(Vector<Object> PropertyVector) 
	{
		this.propertyvector.addAll(PropertyVector);
	}

}
